#define _CRT_SECURE_NO_WARNINGS  //VS使用scanf报错时，在第一行加上该语句（报错提示中会有）

#include<stdio.h>

int main()
{
	//scanf = scan + format
	//语法与printf类似，但是第一个参数为格式字符串，格式字符串中不能有换行符，否则会报错
	//scanf第一个参数为格式字符串，里面放占位符，可以有多个占位符，后面的参数为变量地址，对应前面的占位符

	//int score = 0;
	//printf("请输入成绩：");
	//scanf("%d",&score);
	//printf("成绩为：%d\n",score);

	//-------------------------------------------------------

	//char arr[50];
	//printf("请输入一个字符串：");
	//scanf("%s",arr);
	////scanf函数相对不安全，有可能出现缓冲区溢出，导致程序崩溃（它不会提前识别是否溢出，而是在溢出后报错）
	////输入字符时，scanf在读到空格时，会停止读取，不会读取后面的字符
	//
	////scanf_s("%s", arr);
	////scanf_s是VS独有的函数，在其他编译器中不可用，跨平台性不好
	//printf("输入的字符串为：%s\n",arr);

	//-------------------------------------------------------

	//int x;
	//float y;

	////用户输入："      -13.45e12# 0"
	//scanf("%d", &x);
	//printf("%d\n", x);//-13
	//scanf("%f", &y);
	//printf("%f\n", y);//449999994880.000000
	////0.45e12 = 0.45 * 10^12
	////小数在内存中可能不会精确保存，所以输出的数字可能会有误差（误差比较小，这里被10^12放大了）
	
	//-------------------------------------------------------

	////scanf的返回值
	////scanf函数返回值是整数，表示读取的变量个数；
	////没有读取任何项或者匹配失败返回0；
	////如果读取发生错误，或者读到文件结尾，返回常量EOF(-1)，表示读取失败/文件结束标志
	////EOF：End Of File，文件结束标志，表示文件已经读完，没有内容了，标记值为-1
	//int a = 0;
	//int b = 0;
	//int c = 0;

	//int r = scanf("%d%d%d", &a, &b, &c);
	////输入示例：a
	////          1 a
	////          1 2 a
	////          1 2 3 
	////          按Ctrl + Z (Enter) Ctrl + Z (Enter)  Ctrl + Z (Enter)，scanf就会读取失败，结束读取
	//   
	//printf("a=%d,b=%d,c=%d\n", a, b, c);
	//printf("r=%d\n", r);

	//-------------------------------------------------------

	////while循环输入
	//int a = 0;
	//int b = 0;
	//int r = 0;

 // //  while (scanf("%d%d", &a, &b) == 2)
 // //  {
 // //	  r = a + b;
 // //      printf("r = %d\n", r);
 // //  }

	//while (scanf("%d%d", &a, &b) !=EOF)
	//{
	//	r = a + b;
	//	printf("r = %d\n", r);
	//}

	//-------------------------------------------------------

	//scanf占位符
	//scanf的占位符与printf的占位符的匹配规则基本一样
	//除 %c 外，其他占位符自动忽略起首输入的空白字符
	// %c 不忽略空白字符，总是返回当前第一个字符
	
	//char ch = 0;
	//scanf("%c", &ch);
	////输入示例："    X"
	//printf("===%c===\n", ch);

	//scanf(" %c", &ch);//占位符 %c 前加一个空格，表示强制跳过字符前的空白字符
	////输入示例："    X"
	//printf("===%c===\n", ch);



	//// %s ：读取一个字符串，遇到空格就停止读取（从第一个非空白字符开始读取，读到空格或换行符停止）
	//// 用 %s 占位符会在字符串末尾添加一个空字符'\0'，表示字符串的结束标志
	//// 
	//char arr[20] = "xxxxxxx";
	//scanf("%s", arr);//"hello world"
 //   printf("%s\n", arr);
	////设置断点，在调试->窗口->监视中查看arr的值和变化


	//-------------------------------------------------------
	
	////其他占位符形式
 //   char str[20] = "xxxxxxx";
	//scanf("%10s", str);// "%<width>" 宽度修饰符，表示最多读取width个字符
	//scanf("%*c", str);// "%*c" 表示跳过一个字符，不读取任何字符(常用于处理残留的换行符)
	//scanf("%*[ ]", str);// "%*[ ]" 表示跳过所有空格

	//scanf("%[a-z]", str);//"%[a-z]"  表示读取[a-z]中的任意字符，遇到不匹配字符就停止读取（只接受小写字母）
	//scanf("%[^0-9]", str);// "%[^0-9]" 表示读取直到遇到数字（只接受非数字字符）
	//scanf("%[^\n]", str);// "%[^\n]" 一直读取，直到读到‘\n’才停止。
	////可以组合使用
	//scanf("%19[^\n]%*c", str);

	////%[...] ：读取一个字符串，遇到不匹配字符就停止读取（从第一个匹配字符开始读取，读到不匹配字符停止）
	////%[x-z]-->仅读取特定字符
	////%[^x-z]-->排除特定字符
	////%[x-z^y]-->排除y，读取x-z

	////为了防止溢出，通常在使用%[...]时，加上宽度修饰符，表示最多读取width个字符，防止溢出

	//-------------------------------------------------------

	//赋值忽略符
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d %d %d", &year, &month, &day);
	//scanf("%d%d%d", &year, &month, &day);//前面的格式字符串有没有空格都可以
	//scanf("%d-%d-%d", &year, &month, &day);//输入格式要与格式字符串匹配
	//scanf("%d,%d,%d", &year, &month, &day);//输入格式要与格式字符串匹配
	printf("%d %d %d\n", year, month, day);

	//如果输入时一定要加上特定字符可以：
	char ch1 = 0;
	char ch2 = 0;
	scanf("%d%c%d%c%d", &year, &ch1, &month, &ch2, &day);//不推荐，不方便阅读且没意义
	printf("%d %d %d\n", year, month, day);

	//可以在任意占位符的 % 后面加上 * ，构成赋值忽略符，表示忽略该占位符，没有对应的变量，没有返回值，不会被存储，解析后被丢弃
	//且不需要为该占位符分配内存，不需要定义变量
	scanf("%d%*c%d%*c%d", &year, &month, &day);
    printf("%d %d %d\n", year, month, day); 


	return 0;
}